<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        const data = [
            {
                id: 1,
                text: '节点1',
                parentId: 0 //这里用0表示为顶级节点
            },
            {
                id: 2,
                text: '节点1_1',
                parentId: 1 //通过这个字段来确定子父级
            }
        ]
        function listToTree(data) {
            let map = {};
            let treeData = [];
            // 将数组映射到对象(这里用 Map 也可以，就是一个映射表的功能，根据 key 查值快)
            for (let i = 0; i < data.length; i++) {
                map[data[i].id] = data[i];
            }
            console.log(JSON.stringify(map));
            for (let i in map) {
                const parentId=map[i].parentId;// 获取当前元素的 parentId
                if (parentId != 0) {// parentId!=0 表明该元素有父元素
                    if (!map[parentId].children) {
                        map[parentId].children = [];
                    }
                    map[parentId].children.push(map[i]);// 将该元素推入对应父元素的 children 属性上，即子元素填充父元素
                } else {
                    treeData.push(map[i]);// parentId===0 表明是顶级节点，直接推到结果数组中，其 children 会被对应子元素填充
                }
            }
            return treeData;
        }
        const res = listToTree(data)
        console.log(res);
    </script>
</body>

</html>